package com.wjw.java.model;

/**
 * 修饰器模式：类似BufferedReader
 */
public class DecoratorModel {


    public static void main(String[] args) {
        BufferedReader_ reader1 = new BufferedReader_(new FileReader_());
        reader1.readFile();//调用子类的方法
        reader1.readFiles(5);//调用子类被增强的方法
        System.out.println("------------------------------------------");
        BufferedReader_ reader2 = new BufferedReader_(new StringReader_());
        reader2.readString();//调用子类的方法
        reader2.readStrings(5);//调用子类被增强的方法
    }
}
//1.抽象类：父类
abstract class  Reader_ {
    public void readFile(){

    }
    public void readString(){

    }
}
//2.子类：相当于节点流,类似FileReader
class FileReader_ extends Reader_{
    public void readFile() {
        System.out.println("读取文件中...");
    }
}
//3.子类:相当于节点流,类似StringReader
class StringReader_ extends Reader_{
    public void readString() {
        System.out.println("读取字符串...");
    }
}
//4.处理类(包装类)：类似BufferedReader,对节点流中的方法进行增强
class BufferedReader_ extends Reader_{

    private Reader_ reader_;

    //可以接收继承了Reader_的所有子类
    public BufferedReader_(Reader_ reader_) {
        this.reader_ = reader_;
    }

    //调用FileReader_中的readFile()方法
    public void readFile(){
        reader_.readFile();
    }

    //调用StringReader_中的readString()方法
    public void readString(){
        reader_.readString();
    }

    /**
     * 扩展FileReader_中的readFile()方法,进行增强,
     * 循环读取
     * @param num
     */
    public void readFiles(int num){
        for (int i = 0; i < num; i++) {
            reader_.readFile();
        }
    }

    /**
     * 扩展StringReader_中的readString()方法,进行增强,
     * 循环读取
     * @param num
     */
    public void readStrings(int num){
        for (int i = 0; i < num; i++) {
            reader_.readString();
        }
    }
}